package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/role")
public class RoleController extends BaseController {
  @Autowired
  private DeptService deptService;
  @Autowired
  private RoleService roleService;
  @Autowired
  private ModuleService moduleService;

  /*
    方法的作用：展示角色列表
    url: /system/role/list.do
    参数： 当前页， 页面大小
    返回： system/role/role-list
     */
  @RequestMapping("/list")
  public String list(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "5") int pageSize) {
    //1. 查询到pageInfo对象
    //companyId是指当前登陆者所属的公司id.;
    PageInfo<Role> pageInfo = roleService.findByPage(pageNum, pageSize, getLoginCompanyId());
    //2. 把PageInfo存储到域中
    request.setAttribute("pageInfo", pageInfo);
    System.out.println(pageInfo.getList());
    //3. 返回到列表页面
    return "system/role/role-list";
  }

  /*
  方法的作用：进入添加角色的页面
  url: /system/role/toAdd.do
  参数： 无
  返回： system/role/role-add
   */
  @RequestMapping("/toAdd")
  public ModelAndView toAdd() {
    //1. 查询所有的部门信息，用于展示部门的下拉列表
    List<Dept> deptList = deptService.findAll(getLoginCompanyId());
    ModelAndView mv = new ModelAndView();
    mv.addObject("deptList", deptList);
    mv.setViewName("system/role/role-add");
    return mv;
   /* request.setAttribute("deptList",deptList);
    return "system/role/role-add";*/
  }

  /*
   方法的作用：保存添加角色以及更新角色的信息
   url: /system/role/edit.do
   参数： role 对象
   返回： 角色列表
    */
  @RequestMapping("/edit")
  public String edit(Role role) {
    //设置当前部门所属的公司
    role.setCompanyId(getLoginCompanyId());
    role.setCompanyName(getLoginCompanyName());
    if (StringUtil.isEmpty(role.getId())) {
      //如果id为空，则为保存
      roleService.save(role);
    } else {
      //如果id不为空， 则为更新
      roleService.update(role);
    }
       /*
            如果返回的路径带有redirect或者是forward是不经过视图解析器。

            路径：
                绝对路径:   不以/开头的路径都是相对路径 , 相对当前程序所在的路径,当前程序所在路径是会发生变化的。
                相对路径：  "/"那这种就是绝对路径
         */
    //这里的"/"代表  http://localhost8080/
    return "redirect:/system/role/list.do";
  }

  /*
 方法的作用：进入修改角色的页面
 url: /system/role/toUpdate.do?id=97f88a8c-90fc-4d52-aed7-2046f62fb498
 参数： id 角色的id
 返回： /system/role/role-update
  */
  @RequestMapping("/toUpdate")
  public String toUpdate(String id) {
    //1. 根据id查询一个角色对象，存储到域中
    Role role = roleService.findById(id);
    request.setAttribute("role", role);
    //3. 返回角色更新页面
    return "system/role/role-update";
  }

  /*
   方法的作用：删除角色
   url: /system/role/delete.do?id=97f88a8c-90fc-4d52-aed7-2046f62fb498
   参数： id 角色的id
   返回： json对象

   json = {flag:true|false , message:"删除成功|删除失败"}
    */
  @RequestMapping("/delete")
  public String delete(String id) {
    roleService.delete(id);
    return "redirect:/system/role/list.do";
  }

  /*
        方法的作用：进入角色分配权限的页面
        url: /system/role/roleModule.do?roleid="+id;
        参数： roleid 角色的id
       返回： system/role/role-module.jsp
 */
  @RequestMapping("/roleModule")
  public String roleModule(String roleid) {
    Role role = roleService.findById(roleid);
    request.setAttribute("role", role);
    return "system/role/role-module";
  }

  /*
         方法的作用：给页面返回符合ztree要求的json格式的数据。
         url: /system/role/getTreeNodes.do
         参数： roleid 角色的id
        返回：json对象

        json格式：
            [
            { id:1, pId:0, name:"Saas管理", open:true},
            { id:11, pId:1, name:"企业管理", open:true},
            { id:111, pId:1, name:"模块管理",open:true},
        ]
  */
  @RequestMapping("/getTreeNodes")
  @ResponseBody
  public List<Map<String, Object>> getTreeNodes(String roleId) {
    //定义一个集合用于存储结果
    List<Map<String, Object>> resultList = new ArrayList<>();
    //1. 查询所有的模块出来
    List<Module> moduleList = moduleService.findAll();
    //2. 查询当前角色已经拥有权限
    List<Module> roleModuleList = moduleService.findRoleModuleByRoleId(roleId);
    // 遍历模块，把模块信息添加到Map中
    for (Module module : moduleList) {
      Map<String, Object> map = new HashMap<>();
      map.put("id", module.getId());
      map.put("name", module.getName());
      map.put("open", true);
      map.put("pId", module.getParentId());
      //使用contains的底层就是相当于上面的代码，注意：比较规则是依赖Module的equals.
      if (roleModuleList.contains(module)) {
        map.put("checked", true);
      }
      /*   map.put("checked",true);*/

      //每遍历一个模块的时候，我都判断一下当前的这个模块，该角色是否拥有。
           /* for (Module roleModuleItem : roleModuleList) {
                if(roleModuleItem.getId().equals(module.getId())){
                    //该角色拥有当前的模块
                    map.put("checked",true);
                }
            }*/

      //3. 再map存储到list中，然后返回即可。
      resultList.add(map);
    }
    return resultList;
  }

  /*
      方法的作用：更新保存角色拥有权限
      url: /system/role/updateRoleModule.do
      参数： roleid 角色的id  moduleIds 模块id字符串
     返回： 角色列表
*/
  @RequestMapping("/updateRoleModule")
  public String updateRoleModule(String roleid, String[] moduleIds) {
    roleService.updateRoleModule(roleid,moduleIds);
    return "redirect:/system/role/list.do";
  }
}
